#ifndef __SDCARD_H__
#define __SDCARD_H__

/* =========================== 用户配置 =========================== */
// clang-format off
#define SD_CARD_TIMEOUT          ((uint32_t)100000000)    // SD卡操作超时时间
#define SD_CARD_TRANSFER_OK      ((uint8_t)0x00)    //传输完成，可以继续下一次传输
#define SD_CARD_TRANSFER_BUSY    ((uint8_t)0x01)    //卡正忙，不可以进行下一次传输
// clang-format on

#include "sdio.h"

#define SD_LOG(format, ...) //debug_printf(format, ##__VA_ARGS__) /* sdcard日志输出 */

static inline uint8_t SD_INIT_FUN(void) /* 用户SD卡初始化接口 */
{
   return 0;
}

static inline void SD_ENTER_CRITICAL(void) /* 用户SD操作进入临界区 */
{
   __disable_irq();
}

static inline void SD_EXIT_CRITICAL(void) /* 用户SD操作退出临界区 */
{
   __enable_irq();
}

static inline uint8_t SD_GET_STATE(void) /* 用户获取SD状态 */
{
   return ((HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER) ? SD_CARD_TRANSFER_OK : SD_CARD_TRANSFER_BUSY);
}
static inline uint8_t SD_READ_BLOCKS(uint8_t *buf, uint32_t addr, uint32_t len, uint32_t timeout) /* 用户读SD数据 */
{
   return HAL_SD_ReadBlocks(&hsd, buf, addr, len, timeout);
}

static inline uint8_t SD_WRITE_BLOCKS(uint8_t *buf, uint32_t addr, uint32_t len, uint32_t timeout) /* 用户写SD数据 */
{
   return HAL_SD_WriteBlocks(&hsd, buf, addr, len, timeout);
}

/* =========================== 外部声明 =========================== */

#include "stdint.h"

/**
 * @brief       初始化SD卡 sdio接口
 * @param       无
 * @retval      返回值:0 初始化正确；其他值，初始化错误
 */
uint8_t sd_init(void);

/**
 * @brief       读SD卡(fatfs/usb调用)
 * @param       pbuf  : 数据缓存区
 * @param       saddr : 扇区地址
 * @param       cnt   : 扇区个数
 * @retval      0, 正常;  其他, 错误代码;
 */
uint8_t sd_read_disk(uint8_t *pbuf, uint32_t saddr, uint32_t cnt);

/**
 * @brief       写SD卡(fatfs/usb调用)
 * @param       pbuf  : 数据缓存区
 * @param       saddr : 扇区地址
 * @param       cnt   : 扇区个数
 * @retval      0, 正常;  其他, 错误代码;
 */
uint8_t sd_write_disk(uint8_t *pbuf, uint32_t saddr, uint32_t cnt);

#endif
